﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;

namespace AvaProvi
{
    [Serializable]
    public class clsAreaComun_CRN:clsEstado,IControlEstados
    {
        #region Propiedades de clase
        public string Descripcion { get; set; }
        public decimal Cantidad { get; set; }
        public string Unidad { get; set; }
        public double VRNm2 { get; set; }
        public double Demerito { get; set; }
        public int IDArea { get; set; }
        public clsTerreno_CRN Terreno { get; set; }
        public double Indiviso { get; set; }
        public double VNRm2
        {
            get
            {
                return this.VRNm2 - (this.VRNm2 * this.Demerito);
            }
        }
        public double ValorAsegurable
        {
            get
            {
                return this.VRNm2 * Convert.ToDouble(this.Cantidad) * 0.85;
            }
        }
        public double ValorParcial
        {
            get
            {
                return this.VNRm2 * Convert.ToDouble(this.Cantidad);
            }
        }
        #endregion

        #region Constructor
        public clsAreaComun_CRN(clsTerreno_CRN objTerreno):base()
        {
            this.Terreno = objTerreno;
            this.Descripcion = string.Empty;
            this.Cantidad = 0;
            this.Unidad = string.Empty;
            this.VRNm2 = 0;
            this.Demerito = 0;
        }
        #endregion

        #region Métodos

        public bool Guardar()
        {
            if (this.DatosValidos())
            {
                if (this.EsNuevo)
                    return CreaNuevaAreaComun();
                else
                {
                    if (this.EsModificado)
                        return ModificaAreaComun();
                    else
                        return EliminaAreaComun();
                }
            }
            return false;
        }

        private bool EliminaAreaComun()
        {
            clsAreaComun_CD objArea_CD = new clsAreaComun_CD();
            return objArea_CD.EliminaAreaComun(this);
        }

        private bool ModificaAreaComun()
        {
            clsAreaComun_CD objArea_CD = new clsAreaComun_CD();
            return objArea_CD.ActualizaAreaComun(this);
        }

        private bool CreaNuevaAreaComun()
        {
            clsAreaComun_CD objArea_CD = new clsAreaComun_CD();
            return objArea_CD.CreaAreaComun(this);
        }

        public bool DatosValidos()
        {
            if ((this.Cantidad == 0) && (this.Descripcion.Length == 0) && (this.VRNm2 == 0) && (this.Unidad.Length ==0))
            {
                this.EsEliminado = true;
                return true;
            }
            if (this.Descripcion.Length == 0)
            {
                MessageBox.Show("Debe de escribir la descripción del área común.\nHasta que corrija los datos se guardará la información.", "Información Inválida", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (this.Cantidad == 0)
            {
                MessageBox.Show("Debe de indicar la cantidad.\nHasta que corrija los datos se guardará la información.", "Información Inválida", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (this.Unidad.Length == 0)
            {
                MessageBox.Show("Debe de indicar la unidad en la que se encuentra el área.\nHasta que corrija los datos se guardará la información.", "Información Inválida", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            if (this.VRNm2 == 0)
            {
                MessageBox.Show("El V.R.N. $/m² debe ser mayor a 0.\nHasta que corrija los datos se guardará la información.", "Información Inválida", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        public static BindingList<clsAreaComun_CRN> RecuperaAreasComunesDeTerreno(clsTerreno_CRN objTerreno)
        {
            clsAreaComun_CD objArea_CD = new clsAreaComun_CD();
            BindingList<clsAreaComun_CRN> blAreasComunes = new BindingList<clsAreaComun_CRN>();
            BindingList<dsTerreno.AreasComunesRow> blAreasRecuperadas = objArea_CD.RecuperaAreasComunesDeAvaluo(objTerreno.Inmueble.Avaluo.IdAvaluo);
            foreach (dsTerreno.AreasComunesRow filaArea in blAreasRecuperadas)
            {
                clsAreaComun_CRN objArea = new clsAreaComun_CRN(objTerreno);
                objArea.Cantidad = filaArea.Cantidad;
                objArea.Demerito = filaArea.Demerito;
                objArea.Descripcion = filaArea.Descripcion;
                objArea.EsModificado = true;
                objArea.IDArea = filaArea.IDArea;
                objArea.Unidad = filaArea.Unidad;
                objArea.VRNm2 = filaArea.VRNm2;
                objArea.Indiviso = filaArea.Indiviso;
                blAreasComunes.Add(objArea);
            }
            return blAreasComunes;
        }

        #endregion
    }
}
